package com.ids.transfer.item;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.SQLTimeoutException;
import java.util.HashMap;

import com.ids.transfer.AbtractExtra;
import com.ids.transfer.ExtraParam;
import com.ids.transfer.config.Constant;
import com.ids.transfer.config.DatasourceConfig;
import com.ids.transfer.config.ItemConfig;
import com.ids.transfer.config.TaskConfig;
import com.ids.transfer.util.DbUtils;
import com.ids.transfer.util.ExtraUtils;
import com.ids.transfer.util.StrCharUtil;

/**
 * 一般数据抽取，主要处理select和insert
 * @author gold
 *
 */
public class ExecuteOnlyItem extends AbtractExtra // 必须继承自AbtractEtra抽取类
{

	private ExtraParam ep;
	
	public void beginEtra() {
		if (logger.isDebugEnabled()) {
			logger.debug("start of Extra-data!");
		}
	}

	public void endEtra() {
		if (logger.isDebugEnabled()) {
			logger.debug("end of Extra-data!");
		}
	}

	// 1.完成数据驱动
	// 2.需要进行实现类的编写
	// 3.需要进行定时类的编写--分为手动和自动两种
	// 4.占不考虑主键
	// 5.先考虑定时服务
	// 6.实现类应该是传递过来的
	// 7.执行当前Item下的所有SQL
	// items在外面控制
	public void executeExtra() {
		DatasourceConfig srcDsc, desDsc; // 源和目的数据源信息配置类
		//这一层放在外面来控制
		ItemConfig[] iccs; // 任务下的实现类信息
		HashMap<String,ItemConfig> items;
		//实现类可能对应的是同一个类，
		ItemConfig icc;
		TaskConfig tc; // 任务配置信息
		HashMap param = ep.getParam();

		// 通过强制类型转化得到所有的数据抽取前的初始化信息
		srcDsc = (DatasourceConfig) param.get(ExtraParam.SRCDSC);
		desDsc = (DatasourceConfig) param.get(ExtraParam.DESDSC);
		//只是xml里的配置信息
		items = (HashMap<String, ItemConfig>) param.get(ExtraParam.ITEMS);
		tc = (TaskConfig) param.get(ExtraParam.TASKCONFIG);
		// 此处书写你自己的代码:自定义的参数，如果没有，就不必写,大多数情况下忽略此部分代码的书写
		
		
		// 得到源和目的JDBC连接,用到的JDBC驱动必须在CLASSPATH路径中
		Connection srcConn = null;
		Connection desConn = null;
		try {
			srcConn = srcDsc.getConnection();
			desConn = desDsc.getConnection();
		} catch (SQLTimeoutException e2) {
			// TODO Auto-generated catch block
			e2.printStackTrace();
		}
		try {
			// String itemName=getName();

				icc=items.get(getName());
				System.out.println("任务ID:" + tc.getId() + ",实现类:" + icc.getType());

				// ---------------------------------

				HashMap sqlMap = icc.getPmap();
				int num = icc.getModuleNum();
				String[] srcFroms = new String[num];
				String[] sqlTos = new String[num];
				String[] sqlPks = new String[num];
				for (int i = 0; i < num; i++) {
					srcFroms[i] = (String) sqlMap.get("m" + i + "_from");
					sqlTos[i] = (String) sqlMap.get("m" + i + "_to");
					logger.info("SQL_from:"+srcFroms[i]);
					logger.info("SQL_to:"+sqlTos[i]);
					
					if(!StrCharUtil.isNull(srcFroms[i])){
						if(srcFroms[i].substring(0, 6).toUpperCase().equals("SELECT")){
							DbUtils.executeQuery(srcConn, srcFroms[i]);
							
						}else{
							DbUtils.executeUpdate(srcConn, srcFroms[i]);
						}
					}
					if(!StrCharUtil.isNull(sqlTos[i])){
						if(sqlTos[i].substring(0, 6).toUpperCase().equals("SELECT")){
							DbUtils.executeQuery(desConn, sqlTos[i]);
						}else{
							DbUtils.executeUpdate(desConn, sqlTos[i]);
						}
						
					}
				}
		} catch (Exception e) {
			try {
				desConn.rollback();
				logger.error("执行异常，rollback success!");
			} catch (SQLException e1) {
				logger.error("执行异常，rollback failure!");
				e1.printStackTrace();
			}
			e.printStackTrace();
		} finally {
			DbUtils.close(srcConn);
			DbUtils.close(desConn);
		}
		
	}

	// 抽取函数
	public void extra() {
		beginEtra(); // 开始抽取准备
		executeExtra(); // 数据抽取
		endEtra(); // 抽取结束工作
	}

	@Override
	public void setParams(ExtraParam ep) {
		// TODO Auto-generated method stub
		if (this.ep == null)
			this.ep = ep;
		else {
			this.ep.addParam(ep);
		}
	}

	@Override
	public ExtraParam getParams() {
		// TODO Auto-generated method stub
		return ep;
	}



}